package infod

import (
	"time"

	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/core/common"
	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/ddd"
)

var (
	_ InfoOplogAggregateRoot = &infooplogAggregateRoot{}
)

const (
	// InfoOplogAgID 信息操作记录聚合根ID
	InfoOplogAgID = "infooplog"
)

func initInfoOplog(d ddd.Domain, repo InfoOplogRepo) {
	ar := &infooplogAggregateRoot{}
	ar.Init(ar, d, InfoOplogAgID)
	repo.Init(repo, ar, InfoOplogAgID)
}

// InfoOplogAggregateRoot 信息操作记录的聚合根
type InfoOplogAggregateRoot interface {
	ddd.AggregateRoot
	// 分页获取信息操作记录列表：根据唯一标识获取下一页指定数量的信息操作记录实体集合
	// total 总数量
	QueryPage(ctx ddd.Context, is InfoOplogSearch, pi common.PageInfo) (npi common.PageResult, result []InfoOplogAggregate, err error)
}

// InfoOplogRepo 信息操作记录仓储
type InfoOplogRepo interface {
	ddd.Repository
	// 分页获取信息操作记录列表：根据唯一标识获取下一页指定数量的信息操作记录实体集合
	// total 总数量
	QueryPage(ctx ddd.Context, is InfoOplogSearch, pi common.PageInfo) (npi common.PageResult, result []InfoOplogAggregate, err error)
}

// InfoOplogSearch 查询条件
type InfoOplogSearch struct {
	InfoID string ``
}

// InfoOplogAggregate 信息操作记录聚合
type InfoOplogAggregate struct {
	ddd.BaseAggregate
	InfoOplogID   string `json:"id"`
	InfoOplogDesc `json:"desc"`
}

// InfoOplogDesc InfoOplog描述实例
type InfoOplogDesc struct {
	InfoID   string    `json:"info_id"`
	Operator string    `json:"operator"`
	OpTime   time.Time `json:"op_time"`
	Action   string    `json:"action"`
}

// Repo 获取聚合根对应的仓储
func (i *InfoOplogAggregate) Repo() InfoOplogRepo {
	return i.Repository().(InfoOplogRepo)
}

type infooplogAggregateRoot struct {
	ddd.BaseAggregateRoot
}

func (i *infooplogAggregateRoot) Repo() InfoOplogRepo {
	return i.Repository().(InfoOplogRepo)
}

// 分页获取信息操作记录列表：根据唯一标识获取下一页指定数量的信息操作记录实体集合
// total 总数量
func (i *infooplogAggregateRoot) QueryPage(ctx ddd.Context, is InfoOplogSearch, pi common.PageInfo) (common.PageResult, []InfoOplogAggregate, error) {
	return i.Repo().QueryPage(ctx, is, pi)
}
